package com.ftx.controller.test.annotation.beans;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * bean的生命周期
 *   bean的创建 - 初始化 - 销毁的过程
 *   容器管理bean的声明周期
 *   可以自定义初始化和销毁方法，容器在bean进行到当前声明周期的时候来调用我们自定义的初始化和销毁方法
 *
 *   1.指定初始化和销毁方法
 *     在spring-config.xml中配置初始化bean
 *     <bean id="hotService" class="" init-method="listHot" destroy-method="listHot"/>
 *   构造方法（对象创建）：
 *       单实例：在容器启动的时候创建对象
 *       多实例：在每次获取的时候创建对象
 *   初始化：
 *      对象创建完成，并把依赖的属性赋值好，调用初始化方法
 *
 *   销毁：
 *      单实例bean：容器关闭的时候处理
 *      多实例bean：容器不会管理这个bean，不调用destroy方法
 *   2. bean实现InitializingBean 自定义初始化逻辑
 *      bean 实现 DisposableBean 自定义销毁逻辑
 *   3. 也可以使用JSR 250：
 *          @PostConstruct : bean创建完成，属性赋值完成，执行初始化， 可以指定到方法上
 *          @PreDestroy : 在容器销毁bean之前调用
 *   4.BeanPostProcessor 在bean初始化前后做一些操作
 *          postProcessBeforeInitialization 在初始化之前做一些工作 (like InitializingBean's {@code afterPropertiesSet}
 * 	 * or a custom init-method)
 *          postProcessAfterInitialization
 *     遍历容器中所有的BeanPostProcessor ，一旦有一个返回null，则跳出for循环，不会执行后面的BeanPostProcessor
 *
 *     BeanPostProcessor
 *
 *
 *
 * Created by fengtingxin on 2020/4/15.
 */
@ComponentScan("com.ftx.controller.test.annotation.beans")
@Configuration
public class MainConfigBeans {

    @Scope("prototype")
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Car car(){
        return new Car();
    }



}
